// Phan_Van_Vu_SAI_GLTest.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include "Util.h"
#include <time.h>
#include <iostream>
#include <stdlib.h>
using namespace std;

#define GWIDTH 29  // màn hình game gồm 35 cột
#define GHEIGHT 40 // và 50 dòng
struct Egg{
	int x;int y;
	int ox;int oy;
	int flag;// dùng để xác định trứng đó có đang xài hay không
	int value;// xac định coi là trứng hay phân
};
struct Basket{
	int x; int y;
	int ox; int oy;
};
struct Bird{
	int x; int y;
	int ox; int oy;
	int count;// dung de tha trung hoac chat thai
	clock_t start; //biến đếm thời gian để thả đồ.
	int derection;
};
int numberEggs = 10;
Basket basket[9];
Basket direction;
int basketLength = 9;
Egg eggArray[10];
Bird chick[5];// mảng 5 con gà
Bird duck[5];// mảng 5 con vịt
Bird geese[5];// mảng 5 con ngan
int numberChick = 5;// số lượng tối đa của mỗi con gia cầm
int boardW, boardH; // kích thước của màn hình game
int life = 3;// cho mạng sống là 3
bool endGame; // biến kiểm tra kết thúc game
double tickSpeed;// điều chỉnh thời gian rơi của đồ vật.
int speedMove; // dùng để làm giảm tốc độ rơi của trứng.
int speedMoveBird;// dùng để làm giảm tốc độ của gia cầm.
int g=0,d = 0, n = 0,e = 0; // dung cho mang ga, vit, ngan va egg.
int barrierTop = 9;
int barrierDown = 39;
int point = 0;// điểm của trò chơi.
void init() {
	setFullScreen();
	//khởi tạo tốc độ ban đầu
	tickSpeed = 5;
	// khởi tạo một số giá trị ban đầu
	endGame = false;
	boardW = 29; boardH = 40;
	//////tao vi tri con gà
	chick[0].x = 10;
	chick[0].y = 5;
	chick[0].start = clock();
	//////tạo vị trí con vịt
	duck[0].x = 1;
	duck[0].y = 2;
	duck[0].start = clock();
	////tạo vị trí con ngan
	geese[0].x = 20;
	geese[0].y = 7;
	geese[0].start = clock();
	// tạo thanh hứng
	basket[0].x = 23; basket[0].y = 37;
	basket[1].x = 22; basket[1].y = 37;
	basket[2].x = 21; basket[2].y = 37;
	basket[3].x = 20; basket[3].y = 37;
	basket[4].x = 19; basket[4].y = 37;
	basket[5].x = 18; basket[5].y = 37;
	basket[6].x = 17; basket[6].y = 37;
	basket[7].x = 16; basket[7].y = 37;
	basket[8].x = 15; basket[8].y = 37;
	SetBGColor(8);
	for (int i = 0; i < boardW; i++) {
		for (int j = 0; j < boardH; j++) {
			gotoxy(i, j);
			printf(" ");
		}
	}
	// đặt màu chữ
	SetColor(14);
}
void drawBasket(Basket dir) {
	SetColor(14);
	for (int i = 0; i < basketLength; i++) {
		gotoxy(basket[i].x, basket[i].y);
		printf("%c", 61); // dùng dấu bằng
	}
	if(dir.x == 1){
		gotoxy(basket[basketLength-1].ox, basket[basketLength-1].oy);
		printf(" "); // xóa phần đuôi trước đó của nó
	}else{
		gotoxy(basket[0].ox, basket[0].oy);
		printf(" "); // xóa phần đuôi trước đó của nó
	}
}
void drawChick(Bird temp[5]){
	SetColor(14);
	for(int i = 0; i<numberChick; i++){
		if( temp[i].y == 0 && temp[i].x == 0)
		{
			//không làm gì cả.
		}else{
			gotoxy(temp[i].x, temp[i].y);
			printf("%c", 71);
			gotoxy(temp[i].ox,temp[i].oy);
			printf(" "); // xóa phần đuôi trước đó của nó
		}
	}
}
void drawDuck(Bird temp[5]){
	SetColor(14);
	for(int i = 0; i<numberChick; i++){
		if( temp[i].y == 0 && temp[i].x == 0)
		{
			//không làm gì cả.
		}else{
			gotoxy(temp[i].x, temp[i].y);
			printf("%c", 86);
			gotoxy(temp[i].ox,temp[i].oy);
			printf(" "); // xóa phần đuôi trước đó của nó
		}
	}
}
void drawGeese(Bird temp[5]){
	SetColor(14);
	for(int i = 0; i<numberChick; i++){
		if( temp[i].y == 0 && temp[i].x == 0)
		{
			//không làm gì cả.
		}else{
			gotoxy(temp[i].x, temp[i].y);
			printf("%c", 78);
			gotoxy(temp[i].ox,temp[i].oy);
			printf(" "); // xóa phần đuôi trước đó của nó
		}
	}
}
void drawGuide(){
	SetColor(15);
	gotoxy(31,0);
	printf("%s","Huong dan:");
	gotoxy(31,1);
	printf("%s","- Su dung phim mui ten trai,phai de di chuyen ");
	gotoxy(31,2);
	printf("%s","- Bam G xuat hien them 1 con ga ");
	gotoxy(31,3);
	printf("%s","- Bam V xuat hien them 1 con vit ");
	gotoxy(31,4);
	printf("%s","- Bam N xuat hien them 1 con ngan ");
	gotoxy(31,5);
	printf("%s","- An mau xanh la duoc cong diem ");
	gotoxy(31,6);
	printf("%s","- An mau do la duoc cong mang ");
	gotoxy(31,7);
	printf("%s","- An mau trang la bi tru mang ");
}
void drawPoint()
{
	SetColor(10);
	gotoxy(0, 0);
	printf("Diem: %d", point*100);
}
void drawLife()
{
	SetColor(10);
	gotoxy(0, 1);
	printf("Mang: %d", life);
}
void drawBarrierTop(){
	SetColor(0);
	for(int i = 0; i< boardW; i++)
	{
		gotoxy(i,barrierTop);
		printf("-");
	}
}
void drawBarrierDown(){
	SetColor(0);
	for(int i = 0; i< boardW; i++)
	{
		gotoxy(i,barrierDown);
		printf("-");
	}
}
void drawEgg(){

	for(int i = 0 ; i< numberEggs; i++)
	{
		if(eggArray[i].flag == 1 && eggArray[i].value==0){
			SetColor(10);
			gotoxy(eggArray[i].x , eggArray[i].y);
			printf("%c", 3);
			gotoxy(eggArray[i].ox , eggArray[i].oy);
			printf(" "); // xóa phần đuôi trước đó của nó
		}else if(eggArray[i].flag == 1 && eggArray[i].value==1){
			SetColor(15);
			gotoxy(eggArray[i].x , eggArray[i].y);
			printf("%c", 5);
			gotoxy(eggArray[i].ox , eggArray[i].oy);
			printf(" "); // xóa phần đuôi trước đó của nó
		}else if(eggArray[i].flag == 1 && eggArray[i].value==2){
			SetColor(12);
			gotoxy(eggArray[i].x , eggArray[i].y);
			printf("%c", 3);
			gotoxy(eggArray[i].ox , eggArray[i].oy);
			printf(" "); // xóa phần đuôi trước đó của nó
		}
	}
}
void moveChick(Bird temp[5]){ 
	// di chuyển
	speedMoveBird = speedMoveBird + 1;
	if(speedMoveBird == 5){
		for(int i = 0; i < numberChick ; i++)
		{
			if( temp[i].y == 0 && temp[i].x == 0)
			{

			}else{
				temp[i].ox = temp[i].x;
				temp[i].oy = temp[i].y;
				temp[i].x = temp[i].x +1;	
				temp[i].count ++;

				// quay lại màn hình bên trái
				if(temp[i].x >= boardW)
				{
					temp[i].x = 0;
				}
				//thời gian hiện tại
				clock_t current = clock();
				//random gia tri de xac dinh coi là trứng hay là phân :D
				int value = rand()%(10-1+1)+1;
				if((current - temp[i].start )/CLOCKS_PER_SEC >= 5)
				{
					temp[i].start = current;
					for(int j = 0 ; j <numberEggs; j++){
						if(eggArray[j].flag == 0){
							eggArray[j].flag = 1;
							eggArray[j].x = temp[i].x;
							eggArray[j].y = barrierTop+1;
							if(value ==10)
							{
								eggArray[j].value = 1;//phân
							}
							else if(value == 9){
								eggArray[j].value = 2;//mạng
							}
							break;
						}
					}
				}
			}
		}
		speedMoveBird = 0;
	}
}
void moveDuck(Bird temp[5]){ 
	// di chuyển
	speedMoveBird = speedMoveBird + 1;
	if(speedMoveBird == 5){
		for(int i = 0; i < numberChick ; i++)
		{
			if( temp[i].y == 0 && temp[i].x == 0)
			{

			}else{
				temp[i].ox = temp[i].x;
				temp[i].oy = temp[i].y;
				temp[i].x = temp[i].x  - 1;	
				// quay lại màn hình bên phải
				if(temp[i].x <= 0)
				{
					temp[i].x = boardW - 1;
				}
				//thời gian hiện tại
				clock_t current = clock();
				//random gia tri de xac dinh coi là trứng hay là phân :D
				int value = rand()%(10-1+1)+1;
				if((current - temp[i].start )/CLOCKS_PER_SEC >= 5)
				{
					temp[i].start = current;
					for(int j = 0 ; j <numberEggs; j++){
						if(eggArray[j].flag == 0){
							eggArray[j].flag = 1;
							eggArray[j].x = temp[i].x;
							eggArray[j].y = barrierTop+1;
							if(value ==10)
							{
								eggArray[j].value = 1;//phân
							}
							else if(value == 9){
								eggArray[j].value = 2;//mạng
							}
							break;
						}
					}
				}
			}

		}
		speedMoveBird = 0;
	}

}
void moveGeese(Bird temp[5]){ 
	// di chuyển
	speedMoveBird = speedMoveBird + 1;
	if(speedMoveBird == 5){
		for(int i = 0; i < numberChick ; i++)
		{
			if( temp[i].y == 0 && temp[i].x == 0)
			{
				// không làm gì cả
			}else{
				temp[i].ox = temp[i].x;
				temp[i].oy = temp[i].y;
				if(temp[i].derection == 0){
					temp[i].x = temp[i].x  + 1;
				} else if(temp[i].derection == 1){
					temp[i].x = temp[i].x - 1;
				}
				// quay lại màn hình bên phải
				if(temp[i].x - 1 <= 0)
				{
					temp[i].derection = 0;
				} else if(temp[i].x + 1 >= boardW){
					temp[i].derection = 1;
				}

				//thời gian hiện tại
				clock_t current = clock();
				//random gia tri de xac dinh coi là trứng hay là phân :D
				int value = rand()%(10-1+1)+1;
				if((current - temp[i].start )/CLOCKS_PER_SEC >= 5)
				{
					temp[i].start = current;
					for(int j = 0 ; j <numberEggs; j++){
						if(eggArray[j].flag == 0){
							eggArray[j].flag = 1;
							eggArray[j].x = temp[i].x;
							eggArray[j].y = barrierTop+1;
							if(value ==10)
							{
								eggArray[j].value = 1;//phân
							}
							else if(value == 9){
								eggArray[j].value = 2;//mạng
							}
							break;
						}
					}
				}
			}
		}
		speedMoveBird = 0;
	}

}
// di chuyển trứng
void moveEgg(Egg eggArray[10]){
	////di chuyển egg và kiểm soát tốc độ của trứng rơi.
	speedMove = speedMove + 1;
	if(speedMove == 5){
		for(int j = 0; j <numberEggs; j++)
		{
			if(eggArray[j].flag == 1){
				eggArray[j].ox = eggArray[j].x;
				eggArray[j].oy = eggArray[j].y;
				eggArray[j].y = eggArray[j].y + 1;
			}
		}
		speedMove = 0;
	}
	for(int j = 0; j <numberEggs; j++){
		for (int i = 0; i < basketLength; i++){
			// dùng để hứng khi ăn trứng
			if(eggArray[j].y == basket[i].y && eggArray[j].x == basket[i].x && eggArray[j].flag == 1 && eggArray[j].value == 0)
			{
				point ++;//cộng điểm
				if(tickSpeed >= 0.5)
				{
					tickSpeed = tickSpeed - 0.1;// 20 cái thì trừ 2 tốc độ nhanh hơn
				}			
				eggArray[j].flag = 0;
				gotoxy(eggArray[j].x,eggArray[j].y - 1);
				printf(" ");
				break;
			}else if(eggArray[j].y == basket[i].y && eggArray[j].x == basket[i].x && eggArray[j].flag == 1 && eggArray[j].value == 1){
				// khi ăn phải phân :D
				life = life - 1;
				eggArray[j].flag = 0;
				gotoxy(eggArray[j].x,eggArray[j].y - 1);
				printf(" ");
				eggArray[j].value = 0;
				break;
			}
			else if(eggArray[j].y == basket[i].y && eggArray[j].x == basket[i].x && eggArray[j].flag == 1 && eggArray[j].value == 2){
				// khi ăn được mạng :D
				life = life + 1;
				eggArray[j].flag = 0;
				gotoxy(eggArray[j].x,eggArray[j].y - 1);
				printf(" ");
				eggArray[j].value = 0;
				break;
			}
		}
		//xác định khi trứng rơi xuống hàng rào bên dưới
		if(eggArray[j].y == barrierDown && eggArray[j].flag == 1 && eggArray[j].value == 0)
		{
			eggArray[j].flag = 0;
			life = life - 1;
		} else if (eggArray[j].y == barrierDown && eggArray[j].flag == 1 && (eggArray[j].value == 1||eggArray[j].value == 2)){
			eggArray[j].flag = 0;
			eggArray[j].value = 0;
		}
	}
}
// di chuyển thanh hứng
void moveBasket(Basket dir) {
	if(dir.x == -1){
		for (int i = 0; i < basketLength; i++) {
			basket[i].ox = basket[i].x;
			basket[i].oy = basket[i].y;
			basket[i].x = basket[i].x + dir.x;
			basket[i].y = basket[i].y + dir.y;

			// khi vượt ra khỏi màn hình thì cho nó xuất hiện lại bên kia.
			if(basket[i].x  < 0)
			{
				basket[i].x = boardW - 1;
			}
		}
	}else{
		for (int i = basketLength - 1 ; i >= 0; i--) {
			basket[i].ox = basket[i].x;
			basket[i].oy = basket[i].y;
			basket[i].x = basket[i].x + dir.x;
			basket[i].y = basket[i].y + dir.y;

			// khi vượt ra khỏi màn hình thì cho nó xuất hiện lại bên kia.
			if(basket[i].x >= boardW)
			{
				basket[i].x = 0;
			}
		}
	}

}
// vòng lặp chính xử lý logic trong này
void mainLoop() {

	moveEgg(eggArray);
	moveGeese(geese);
	moveChick(chick);
	moveDuck(duck);

	if (checkKey(KEY_ESC)) {
		endGame = true;
	}
	if(checkKey(KEY_G)){
		//thêm 1 con gà vào
		if( g < numberChick){
			g = g++;
			int x = rand()%((boardW-1)-1+1)+1;
			int y = rand()%(8-0+1)+0;
			chick[g].x = x;
			chick[g].y = y;
			chick[g].start = clock();
			
		}
	}
	if(checkKey(KEY_V)){
		//thêm 1 con vịt vào
		if( d < numberChick){
			d = d++;
			int x = rand()%((boardW-1)-1+1)+1;
			int y = rand()%(8-0+1)+0;
			duck[d].x = x;
			duck[d].y = y;
			duck[d].start = clock();
			
		}
	}
	if(checkKey(KEY_N)){
		//thêm 1 con ngan vào
		if( n < numberChick){
			n = n++;
			int x = rand()%((boardW-1)-1+1)+1;
			int y = rand()%(8-0+1)+0;
			geese[n].x = x;
			geese[n].y = y;
			geese[n].start = clock();

		}
	}
	if(life <= 0){
		endGame = true;
	}
	if (checkKey(KEY_LEFT)) {
		//dùng dể loại trừ hướng di chuyển ngược chiều
		direction.x = -1;
		direction.y = 0;
		moveBasket(direction);
	}
	else if (checkKey(KEY_RIGHT)) {
		direction.x = 1;
		direction.y = 0;
		moveBasket(direction);
	}

}
// dùng để vẽ hình ảnh
void drawGame() {
	drawGuide();
	drawChick(chick);
	drawDuck(duck);
	drawGeese(geese);
	drawBarrierTop();
	drawBarrierDown();
	drawEgg();
	drawBasket(direction);
	drawPoint();
	drawLife();
}
int _tmain(int argc, _TCHAR* argv[])
{
	init();
	ShowCur(false); // Ẩn con trỏ
	SetColor(14); // Thiết lập màu chữ (vàng)
	while (!endGame){
		Tick(tickSpeed, mainLoop, drawGame); // Mainloop
	}
	return 0;
}

